package com.cellulam.framework.datasource.dao;

import com.cellulam.framework.core.model.PagerCriteria;
import com.cellulam.framework.datasource.FetchDataBean;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 * @param <PK> 主键类型
 * @param <E> 实体类型(Bean), 也可以为查询条件
 */
public interface CrudDao<PK, E> {

    /**
     * 根据主键查询
     * @param id
     * @return
     */
    E getById(PK id);

    /**
     *
     * @param entity
     * @return
     */
    int save(E entity);

    /**
     *
     * @param entity
     * @return
     */
    int update(E entity);

    /**
     * 批量查询
     * @param condition 实体(Bean)即为查询的条件
     * @return
     */
    List<E> query(PagerCriteria<E> condition);

    /**
     * 计算总数
     * @param condition
     * @return
     */
    long count(PagerCriteria<E> condition);

    /**
     * 获取数据
     * @param start
     * @param limit
     * @param criteria
     * @return
     */
    List<FetchDataBean<E>> fetch(@Param("start") long start, @Param("limit") int limit, @Param("criteria") E criteria);

    /**
     * 锁行
     * @param id
     * @return
     */
    E lockById(PK id);
}
